import dayjs,{Dayjs} from "dayjs";
import isBetween from "dayjs/plugin/isBetween";
import { KDate } from "@/types/utils";
dayjs.extend(isBetween);

export function formatDate(date: KDate, format = "YYYY-MM-DD hh:mm:ss") {
  return dayjs(date).format(format);
}

/**
 * 判断给定日期是否在指定的时间段范围内
 * @param {string} dateStr 要判断的日期字符串，格式为 'YYYY-MM-DD'
 * @param {string} rangeStr 时间段范围字符串，格式为 'YYYY-MM-DD-YYYY-MM-DD'
 * @returns {boolean} 日期是否在时间段范围内
 */
export function isDateInRange(
  dateStr: string,
  rangeStr: string,
  decollator = "/"
) {
  const date = dayjs(dateStr);
  const [startStr, endStr] = rangeStr.split(decollator);
  return date.isBetween(startStr, endStr, "day", "[]");
}

// 日期偏移
export function offest(date: KDate, diffDay: number, action = "add") {
  return (dayjs(date) as any)[action](diffDay, "day");
}
// 获取时间段内最大的日期
export function getMaxRangeDate(dates: KDate[]) {
  let date = dates.reduce((max, date) => {
    const currentDate = dayjs(date);
    return currentDate.isAfter(max) ? currentDate : max;
  }, dayjs("1970-01-01")); // 设置一个最小的初始日期
  return formatDate(date);
}
// 日期是否大于今日
export function hasAfterToday(date: KDate) {
  const today = dayjs();
  return dayjs(date).isAfter(today);
}

/**
 * 计算给定时间段内相差的天数
 * @param {string} rangeStr 时间段范围字符串,格式为 'YYYY-MM-DD/YYYY-MM-DD'
 * @returns {number} 时间段内相差的天数
 */
export function diffInDateRange(rangeStr: string, decollator = "/") {
  const { start, end } = parseDateRange(rangeStr, decollator);
  return end.diff(start, "days") + 1; // 加 1 是为了包含开始日期
}

/**
 * 解析时间段范围字符串为对象
 * @param {string} rangeStr 时间段范围字符串,格式为 'YYYY-MM-DD/YYYY-MM-DD'
 * @returns {{ start: Dayjs, end: Dayjs }} 包含开始和结束时间的对象
 */
export function parseDateRange(rangeStr: string, decollator = "/") {
  const [startStr, endStr] = rangeStr.split(decollator);
  return {
    start: dayjs(startStr),
    end: dayjs(endStr),
  };
}

/**
 * 比较两个时间段范围的大小
 * @param {string} range1Str 第一个时间段范围字符串,格式为 'YYYY-MM-DD/YYYY-MM-DD'
 * @param {string} range2Str 第二个时间段范围字符串,格式为 'YYYY-MM-DD/YYYY-MM-DD'
 * @returns {number} 负数表示 range1 小于 range2, 0 表示相等, 正数表示 range1 大于 range2
 */
export function compareDateRanges(
  range1Str: string,
  range2Str: string,
  decollator = "/"
) {
  const range1 = parseDateRange(range1Str,decollator);
  const range2 = parseDateRange(range2Str, decollator);

  const startDiff = range1.start.diff(range2.start, "days");
  const endDiff = range1.end.diff(range2.end, "days");

  if (startDiff === 0 && endDiff === 0) {
    return 0; // 时间段相等
  } else if (startDiff < 0 || (startDiff === 0 && endDiff < 0)) {
    return -1; // range1 小于 range2
  } else {
    return 1; // range1 大于 range2
  }
}
